今天要來介紹 Docker Swarm。Docker Swarm 是什麼?它是一個能夠在多台的不同實體機器上執行 Docker Container,然後型成一個叢集(Cluster)的一個工具,如下圖:
Manager 的功能是分配 Docker Container 需要執行在哪台的 Node 上,主要的分配策略有以下三種的方式:
**spread:**選擇執行數量較少 Container 的 Node
**binpack:**盡量把 Container 放在同一台的 Node 上執行,這樣就可以減少 Node 的使用量
**random:**隨機的分配 Container 要在哪個 Node 上執行
上圖的 Node1、Node2、Node3 就是主要在執行 Container 的實體機器。在 Docker 1.12 之後 Swarm 就被整合在 Docker 裡面,docker 的 command 裡就有內建的 swarm。但是今天的實作是使用 Swarm 的 Docker Image 來啟動 Container 的方式把Docker Swarm 的 service 啟動起來。
在網路上常常看到 Kubernetes(K8S) 和 Swarm 被拿來比較,如下:
K8S:
Swarm:
今天拿 2 台 Host來實作 Docker Swarm。 host1是 Manager 另外一台 host2 是當作一般的Node。在實作之前要先記得把防火牆閉或是開通特定的 Port
1. 在使用 Docker Swarm 之前需要修改 Docker 的設定檔,並且重新啟動 Docker 的 Service
修改host1 的 /etc/docker/daemon.json
{
"hosts": [
"unix:///var/run/docker.sock",
"tcp://10.1.3.228:2375"
]
}
修改 host2 的 /etc/docker/daemon.json
{
"hosts": [
"unix:///var/run/docker.sock",
"tcp://10.1.3.229:2375"
]
}
重新啟動 Docker 的 Service 指令如下
# systemctl restart docker
2. 在 host1 啟動 consul service,用來存取連線的資訊,指令如下
$ docker run -d -p 8500:8500 --name=consul progrium/consul -server -bootstrap
3. 在 host1 啟動 swarm 的 manager 指令如下
$ docker run -d -p 4000:4000 swarm manage -H :4000 --replication --advertise 10.1.3.228:4000 consul://10.1.3.228:8500
以上的 4000 Port 就是 Swarm Manage 的 Port,使用者只要透過此 Port 就可以操作整個 Docker Cluster 的 Container
4. 在 host2 啟動 swarm 的 Node 指令如下
$ docker run -d swarm join --advertise=10.1.3.229:2375 consul://10.1.3.228:8500
5. Node 啟動之後,就可以使用以下的指令來看整個 Swarm 的狀態
$ docker -H 10.1.3.228:4000 info
畫面如下
6. 在 Docker Cluster 上啟動一個 Docker Container 指令如下
$ docker -H 10.1.3.228:4000 run -d -p 8080:8080 jackyohhub/build-tomcat-test
7. 使用以下指令查看 Docker Container 的狀態
$ docker -H 10.1.3.228:4000 ps -a
畫面如下
今天介紹的 Docker Swarm 讓我們的 Docker 可以形成一整個大的 Cluster 叢集,使得在執行 Container 上可以分散在不同的實體機器上面執行。